package com.melo.graph;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.util.ArrayList;
import java.util.Arrays;

/**
 * @author lichunlong lcl253137@alibaba-inc.com
 * @desc 图
 * @date 2025-04-21
 */
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Graph {

    /**
     * 图的顶点集合
     */
    private ArrayList<String> vertexList;

    /**
     * 图的邻接矩阵
     */
    private int[][] edgeArr;

    /**
     * 边的条数
     */
    private int edgeSize;

    public Graph(int vertexNum) {
        vertexList = new ArrayList<>(vertexNum);
        edgeArr = new int[vertexNum][vertexNum];
        // 初始化边的条数为0: 不知道有多少条边
        edgeSize = 0;
    }

    /**
     * 插入顶点
     *
     * @param vertex 顶点
     */
    public void insertVertex(String vertex) {
        vertexList.add(vertex);
    }

    /**
     * 添加边
     *
     * @param vertex1 第一个顶点的下标
     * @param vertex2 第二个顶点的下标
     * @param weight  权值
     */
    public void insertEdge(int vertex1, int vertex2, int weight) {
        edgeArr[vertex1][vertex2] = weight;
        edgeArr[vertex2][vertex1] = weight;
        edgeSize++;
    }

    /**
     * 返回顶点的个数
     *
     * @return 顶点的个数
     */
    public int getVertexNum() {
        return vertexList.size();
    }

    /**
     * 返回指定下标对应的顶点
     *
     * @param index 顶点的下标
     * @return 顶点值
     */
    public String getVertexByIndex(int index) {
        return vertexList.get(index);
    }

    /**
     * 返回边的个数
     *
     * @return 边的个数
     */
    public int getEdgeNum() {
        return edgeSize;
    }

    /**
     * 返回v1和v2两个顶点之间的权值
     *
     * @param vertex1 第一个顶点
     * @param vertex2 第二个顶点
     * @return 权值
     */
    public int getWeight(int vertex1, int vertex2) {
        return edgeArr[vertex1][vertex2];
    }

    /**
     * 打印图对应的矩阵
     */
    public void showGraph() {
        for (int[] edge : edgeArr) {
            System.err.println(Arrays.toString(edge));
        }
    }
}
